package com.chenziwen.scala.chapter03

class ScalaPerson {

  // Scala中声明属性必须显示的初始化，否则编译出错
  // 因为Scala可以根据属性值得类型自动推断，所以属性类型可以省略
  // 如果给属性设定null（它是Null类型的一个具体对象）作为默认值，那么属性类型最好声明
  // 如果将下划线赋值给属性，那么等同于赋值为当前类型的java默认值，String就是null,Int就是0,以此类推
  private var name: String = _

  def setName(name: String): Unit = {
    this.name = name
  }

  def getName(): String = {
    return name
  }
}

// 如果希望类中存在静态内容，可以使用Scala中特有的伴生对象
//    从技术的角度来讲，Scala还是没有静态内容，只不过是将伴生对象又生成了一个新的类，实现属性get方法的调用
// 伴生对象的名称应该和类名相同
// 伴生类 <==> 伴生对象
// 伴生对象中的属性或方法可以通过类名直接访问调用
// 伴生对象的声明应该和伴生类的声明在同一个源码文件中，但是如果没有伴生类，也就没有所谓的伴生对象了，所以放在哪里就无所谓了
object ScalaPerson {
  val sex: Boolean = true
}

class ScalaEmp {
  // 在Scala中，声明属性，编译器会自动添加类似于set,get方法
  // 编译之后生成的java字节码文件中，set,get方法的定义会是这样的
  // setter   ：  属性名_=(参数)
  // getter   :   属性名()
  // 如果属性声明为private访问权限，那么setter/getter方法也是private的
  private var name: String = _

  // 如果属性不声明为private，那么setter/getter方法是公共的
  var age: Int = _
}


object ScalaTest {
  def main(args: Array[String]): Unit = {
    // 创建对象
    val scalaPerson: ScalaPerson = new ScalaPerson()
    // 对象类型可以省略，可以通过赋值操作自动推断
    val person = new ScalaPerson
    person.setName("张三")
    println(person.getName())


    val emp = new ScalaEmp
    println(emp.age)
    // 调用set方法
    emp.age = 20
    // 调用get方法
    println(emp.age)

    println(ScalaPerson.sex)

    val student = new ScalaStudent
    student.setName("继承")
    println(student.getName())
  }
}